Save scancode inside GdkEventPrivate
authorFrediano Ziglio <fziglio@redhat.com>
Thu, 21 Apr 2016 13:30:58 +0000 (14:30 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 22 Apr 2016 02:35:47 +0000 (22:35 -0400)
Windows save in hardware_keycode an information which is not so low
level and some application require the hardware scancode.
As Windows provides this information save it in GdkEventPrivate
and provide a function to get this information.
For no Windows system the function return the hardware_keycode instead.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
https://bugzilla.gnome.org/show_bug.cgi?id=765259

gdk/broadway/gdkeventsource.c
gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkinternals.h
gdk/mir/gdkmireventsource.c
gdk/quartz/gdkevents-quartz.c
gdk/wayland/gdkdevice-wayland.c
gdk/win32/gdkevents-win32.c
gdk/x11/gdkdevicemanager-core-x11.c
gdk/x11/gdkdevicemanager-xi2.c

index ae5b41e9792163a5632ad09aa43225d630044fd4..9d795c4caacd42f7685a8f285115a20806eefb6f 100644 (file)
@@ -295,6 +295,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
        event->key.keyval = message->key.key;
        event->key.state = message->key.state;
        event->key.hardware_keycode = message->key.key;
+        _gdk_event_set_scancode (event, message->key.key);
        event->key.length = 0;
        gdk_event_set_device (event, device_manager->core_keyboard);
        gdk_event_set_seat (event, gdk_device_get_seat (device_manager->core_keyboard));
index 4a051f25efeee9ad889d50384b4632019273e102..d508dc35414f3a07257b51d0b9fb8c5a1b2dbf6e 100644 (file)
@@ -2464,3 +2464,37 @@ gdk_event_set_device_tool (GdkEvent      *event,
   private = (GdkEventPrivate *) event;
   private->tool = tool;
 }
+
+void
+_gdk_event_set_scancode (GdkEvent *event,
+                         guint16 scancode)
+{
+  GdkEventPrivate *private = (GdkEventPrivate *) event;
+
+  private->key_scancode = scancode;
+}
+
+/**
+ * gdk_event_get_scancode:
+ * @event: a #GdkEvent
+ *
+ * Gets the keyboard low-level scancode.
+ * This is usually hardware_keycode.
+ * On Windows this is the high word of WM_KEY{DOWN,UP} lParam
+ * which contains the scancode and some extended flags.
+ *
+ * Returns: The associated keyboard scancode or 0
+ *
+ * Since: 3.22
+ **/
+int
+gdk_event_get_scancode (GdkEvent *event)
+{
+  GdkEventPrivate *private;
+
+  if (!gdk_event_is_allocated (event))
+    return 0;
+
+  private = (GdkEventPrivate *) event;
+  return private->key_scancode;
+}
index 3e7824f5cc3e7130c1a08dcfe13bf5e19df8de52..0fea302736547f66f3b7da87a65d155a3315d194 100644 (file)
@@ -1451,6 +1451,9 @@ GDK_AVAILABLE_IN_3_22
 void           gdk_event_set_device_tool (GdkEvent       *event,
                                           GdkDeviceTool  *tool);
 
+GDK_AVAILABLE_IN_3_22
+int            gdk_event_get_scancode    (GdkEvent *event);
+
 G_END_DECLS
 
 #endif /* __GDK_EVENTS_H__ */
index f68cd99700bc3c876d488e73e0b20c09c23b9b17..9f7a0ab869ab241872627850f0bdc4c08f7bf5d2 100644 (file)
@@ -190,6 +190,7 @@ struct _GdkEventPrivate
   GdkDevice *source_device;
   GdkSeat   *seat;
   GdkDeviceTool *tool;
+  guint16    key_scancode;
 };
 
 typedef struct _GdkWindowPaint GdkWindowPaint;
@@ -396,6 +397,9 @@ void     _gdk_event_set_pointer_emulated (GdkEvent *event,
                                           gboolean  emulated);
 gboolean _gdk_event_get_pointer_emulated (GdkEvent *event);
 
+void     _gdk_event_set_scancode         (GdkEvent *event,
+                                          guint16 scancode);
+
 void     gdk_event_set_seat              (GdkEvent *event,
                                           GdkSeat  *seat);
 
index a288cb798da994d8ac2895389926905c8627e1d1..c8e7a485318ad1f87badb84e5bec05d329b56734 100644 (file)
@@ -133,6 +133,7 @@ generate_key_event (GdkWindow *window, GdkEventType type, guint state, guint key
   event->key.state = state;
   event->key.keyval = keyval;
   event->key.hardware_keycode = keycode + 8;
+  _gdk_event_set_scancode (event, keycode + 8);
   event->key.is_modifier = is_modifier;
   event->key.time = event_time;
   set_key_event_string (&event->key);
index 62094a8fc9490667c76e82c4c33989f44926c31e..856c946de92993dd24c97103cab4dda1a0b6bc29 100644 (file)
@@ -1134,6 +1134,7 @@ fill_key_event (GdkWindow    *window,
   event->key.time = get_time_from_ns_event (nsevent);
   event->key.state = get_keyboard_modifiers_from_ns_event (nsevent);
   event->key.hardware_keycode = [nsevent keyCode];
+  _gdk_event_set_scancode (event, [nsevent keyCode]);
   event->key.group = ([nsevent modifierFlags] & NSAlternateKeyMask) ? 1 : 0;
   event->key.keyval = GDK_KEY_VoidSymbol;
 
index 96e5fb6bea0577bd3b2a2be962b15209bdf2c9c0..856437df51e99b1cb9225c1f52794968d6652c16 100644 (file)
@@ -1836,6 +1836,7 @@ deliver_key_event (GdkWaylandSeat *seat,
   event->key.state = device_get_modifiers (seat->master_pointer);
   event->key.group = 0;
   event->key.hardware_keycode = key;
+  _gdk_event_set_scancode (event, key);
   event->key.keyval = sym;
   event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key);
 
index c6f6a243cd67b6ca3bc91417796f68acaff6ca79..2c8f0fab1408212fc8da8836094ab3a701dd07b4 100644 (file)
@@ -2339,6 +2339,8 @@ gdk_event_translate (MSG  *msg,
       event->key.string = NULL;
       event->key.length = 0;
       event->key.hardware_keycode = msg->wParam;
+      /* save original scancode */
+      _gdk_event_set_scancode (event, msg->lParam >> 16);
       gdk_event_set_device (event, device_manager_win32->core_keyboard);
       gdk_event_set_source_device (event, device_manager_win32->system_keyboard);
       gdk_event_set_seat (event, gdk_device_get_seat (device_manager_win32->core_keyboard));
index 994d3599036d0b38a7b9c48282c55311ec07332c..84f964116b649bf3295d3d56b62d2b894c9c47a2 100644 (file)
@@ -160,6 +160,7 @@ translate_key_event (GdkDisplay              *display,
   event->key.state = (GdkModifierType) xevent->xkey.state;
   event->key.group = gdk_x11_keymap_get_group_for_state (keymap, xevent->xkey.state);
   event->key.hardware_keycode = xevent->xkey.keycode;
+  _gdk_event_set_scancode (event, xevent->xkey.keycode);
 
   event->key.keyval = GDK_KEY_VoidSymbol;
 
index 836f455abb673fe0e78b1f801c1aeecc90ab6bfc..1e5e77ae8be8ced2220e48fb1de755f9929f92d6 100644 (file)
@@ -1469,6 +1469,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
         event->key.group = xev->group.effective;
 
         event->key.hardware_keycode = xev->detail;
+        _gdk_event_set_scancode (event, xev->detail);
         event->key.is_modifier = gdk_x11_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
 
         device = g_hash_table_lookup (device_manager->id_table,